/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.hochschild.sgv.service.implementacion;

import com.hochschild.sgv.dao.SolicitudDao;
import com.hochschild.sgv.dao.UsuarioDao;
import com.hochschild.sgv.domain.Solicitud;
import com.hochschild.sgv.domain.Usuario;
import com.hochschild.sgv.sap.ConexionSAP;
import com.hochschild.sgv.service.PlanificacionManager;
import com.hochschild.sgv.util.ConexionBD;
import com.hochschild.sgv.util.Constantes;
import com.hochschild.sgv.util.FechaUtil;
import com.sap.mw.jco.JCO.Table;
import com.sun.rowset.CachedRowSetImpl;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sql.rowset.CachedRowSet;
import org.springframework.stereotype.Service;

/**
 *
 * @author Christian Alexander Morales Vargas (cmorales.corporacion@gmail.com)
 */

public class SimplePlanificacionManager implements PlanificacionManager{
     
    public List<Solicitud> consultarRangosFechasEquipo(String idUsuarioSolicitante, String idUsuarioAprobador, int anioActual) {
        List<Solicitud> listSolicitud = new ArrayList<Solicitud>();
        
        StringBuilder  SQL = new StringBuilder();
        String anionow = String.valueOf(anioActual);
        String anioProximo = String.valueOf(anioActual + 1);
        try {
            SQL.append(" SET DATEFORMAT ymd;  SELECT [idSolicitud],[fechaInicio],[fechaFin],[estado],[idUsuarioSolicitante],[idUsuarioAprobador],[motivoSolicitud],[fechaCreacion],[tipoSolicitud]");
            SQL.append(" FROM Solicitud WHERE idUsuarioSolicitante='");
            SQL.append(idUsuarioSolicitante);      
            SQL.append("' AND idUsuarioAprobador ='");
            SQL.append(idUsuarioAprobador);
            
            SQL.append("' AND [fechaInicio] >='");
            SQL.append(anionow);
            SQL.append("-01-01");
            SQL.append("' AND [fechaFin] <='");
            SQL.append(anioProximo);
            SQL.append("-12-31");
            
//            SQL.append("' AND [fechaInicio] <='");
//            SQL.append(anioProximo);
//            SQL.append("-12-31");
//            SQL.append("' AND [fechaFin] >='");
//            SQL.append(anionow);
//            SQL.append("-01-01");
            
            SQL.append("' AND tipoSolicitud ='");
            SQL.append(Constantes.SOLICITUD_PLANIFICADA);
            SQL.append("' ORDER BY [fechaInicio]");

           ResultSet rst = new ConexionBD().ExecuteSelect(SQL.toString(), "SimplePlanificacionManager");
            Solicitud bean;
            int cont = 0;
            while (rst.next()) {
                bean = new Solicitud();
                bean.setFechaInicio(rst.getDate("fechaInicio"));
                bean.setFechaFin(rst.getDate("fechaFin"));
                bean.setIdUsuarioSolicitante(rst.getString("idUsuarioSolicitante"));
                listSolicitud.add(bean);
                cont++;
            }
            if (cont==0) {
                bean = new Solicitud();
                bean.setIdUsuarioSolicitante(idUsuarioSolicitante);
                listSolicitud.add(bean);
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        } 
        
        return listSolicitud;
    }
    
    public String[] consultarDiasLibres(String idUsuario, String FechaInicio, String FechaFin) {
        ConexionSAP conexionSAP = new ConexionSAP();
        String[] arrayDiasLibres = new String[0];
        System.out.println("Fecha Inicio: " + FechaInicio);
        try {
            conexionSAP = ConexionSAP.getConexionSAP();
            conexionSAP.RegistrarRFC("ZMM_RFCFN_DIAS_LIBRES_SGV");
            conexionSAP.IngresarDatosInput(idUsuario, "USER");
            conexionSAP.IngresarDatosInput(FechaInicio, "FECHAINICIO");
            conexionSAP.IngresarDatosInput(FechaFin, "FECHAFIN");
            conexionSAP.EjecutarRFC();
            Table table = conexionSAP.rFC.getTableParameterList().getTable("T_DIAS");
            //Quitar ese +1 solo es para pruebas
            arrayDiasLibres = new String[table.getNumRows()];
            for (int i = 0; i < table.getNumRows(); i++) {
                table.setRow(i);
                arrayDiasLibres[i] = table.getField("LINEA").getString();
                //System.out.println("Dias Libres: " + arrayDiasLibres[i]);
            }
            //arrayDiasLibres[table.getNumRows()] ="05012013";
            
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            conexionSAP.DesconectarSAP();
        }

        return arrayDiasLibres;
    }

    public String[] consultarDiasGozados(String idUsuario, String FechaInicio, String FechaFin) {
        String[] arrayDiasGozados = new String[0];
        ConexionSAP conexionSAP = new ConexionSAP();
        try {
            conexionSAP = ConexionSAP.getConexionSAP();
            conexionSAP.RegistrarRFC("ZMM_RFCFN_VACACIONESG_SGV");
            conexionSAP.IngresarDatosInput(idUsuario, "USER");
            conexionSAP.IngresarDatosInput(FechaInicio, "FECHAINICIO");
            conexionSAP.IngresarDatosInput(FechaFin, "FECHAFIN");
            conexionSAP.EjecutarRFC();
         //   System.out.println("idUsuario:2 " + idUsuario);
            Table table = conexionSAP.rFC.getTableParameterList().getTable("T_DIAS");
            arrayDiasGozados = new String[table.getNumRows()];
            for (int i = 0; i < table.getNumRows(); i++) {
                table.setRow(i);
                arrayDiasGozados[i] = table.getField("LINEA").getString();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            conexionSAP.DesconectarSAP();
        }

        
        return arrayDiasGozados;
    }

    public boolean insertLstPlanificacion(List<Solicitud> lstRegistros, String[] equipo, String idUsuarioAprobador, String est) {
        Boolean f_result = false;
        
        Connection conn = null;
        ConexionBD conBD = null;
        PreparedStatement pstm = null;
        ResultSet rst = null;
        String SQL = "";    String sqlEstado = "";
        int idSolicitud =  0; 
        int diasHabiles = 0;
        String estado = Constantes.SOLICITUD_PLANIFICADA;
        String tipoSolicitud = Constantes.SOLICITUD_PLANIFICADA;
        //System.out.println("cantRegistros: " + idSolicitud) ;
        CallableStatement cstmt = null;
        conBD = new ConexionBD();
        conn = conBD.getConnection();
        Solicitud regSolicitud;
        Iterator it = lstRegistros.iterator();
        int anioActual = FechaUtil.getAnioActual();
        int cont=0;
        StringBuilder strIdUsuarioSolicitante = new StringBuilder();
        try {
                for (int i = 0; i < equipo.length; i++) {
                    if(i>0) strIdUsuarioSolicitante.append(",");
                    strIdUsuarioSolicitante.append("'");
                    strIdUsuarioSolicitante.append(equipo[i] );
                    strIdUsuarioSolicitante.append("'");
                    
                    if(cont!=0) 
                        sqlEstado+=" UNION ALL";
                    cont++;
                    sqlEstado+= " SELECT '" + equipo[i] + "',"
                    + anioActual + ",'"
                    + idUsuarioAprobador + "','"      
                    + est + "'";
                }
                
                System.out.println("strIdUsuarioSolicitante.toString(): " + strIdUsuarioSolicitante.toString());
            cstmt = conn.prepareCall("{call sp_InsertDiasPlanificadas (?,?,?,?,?,?,?,?,?)}");
            cstmt.registerOutParameter(1, Types.VARCHAR);
            cstmt.setInt("cantUsuarioSolicitante", equipo.length);
            cstmt.setString("idUsuarioSolicitante", strIdUsuarioSolicitante.toString());
            cstmt.setString("idUsuarioAprobador",idUsuarioAprobador);
            cstmt.setString("fechaInicio",  String.valueOf(anioActual) + "-01-01" );
            cstmt.setString("fechaFin", String.valueOf(anioActual + 1) + "-12-31" );
           
            idSolicitud =  this.getCantSolicitudes();
                cont=0;
               while (it.hasNext()){
                   regSolicitud = (Solicitud) it.next();
                   diasHabiles = Integer.parseInt(String.valueOf(FechaUtil.cantidadDiasEntreFechas(regSolicitud.getFechaFin(), regSolicitud.getFechaInicio())));
//                        System.out.println( "idUsuarioSolicitante: " + regSolicitud.getIdUsuarioSolicitante()  + " Fecha Inicio: " + FechaUtil.formatoYYYYMMDD_DDMMYYYY(regSolicitud.getFechaInicio()) + " - Fecha Fin: " + FechaUtil.formatoYYYYMMDD_DDMMYYYY(regSolicitud.getFechaFin()) + " diasHabiles: " + diasHabiles + " Jefe: " + regSolicitud.getIdUsuarioAprobador() + " FechaCreacion: " + regSolicitud.getFechaCreacion());
                    idSolicitud++;
                    if(cont!=0) 
                        SQL+=" UNION ALL";
                       
                    cont++;
                    SQL+= " SELECT '" + idSolicitud + "','"
                    + regSolicitud.getFechaInicio() + "','"
                    + regSolicitud.getFechaFin() + "',"
                    + (diasHabiles + 1) + ","
                    + "'" + estado  + "','"
                    + regSolicitud.getIdUsuarioSolicitante() + "',"
                    + "'" + regSolicitud.getIdUsuarioAprobador() + "',"
                    + "'" + tipoSolicitud + "'";  
                    
                    
                }
                    System.out.println("Cantidad Usuarios: " + equipo.length);
                    System.out.println("Insert SQL: " + SQL);
                    System.out.println("Insert Estado: " + sqlEstado);
             cstmt.setString("insertarSolicitud",SQL);  
             //cstmt.setInt("anioActual",anioActual);  
             cstmt.setString("estado",est);  
             cstmt.setString("insertarEstado", sqlEstado);
             rst = cstmt.executeQuery();
            System.out.println("Sentencia: " + cstmt.getString("Result"));
            if (cstmt.getString("Result").equals("5") || cstmt.getString("Result").equals("6")  )
                f_result = true;
            else
                f_result = false;
            
        } catch (SQLException e) {
            e.printStackTrace();
//            try {
//                conn.rollback();
//            } catch (SQLException ex) {
//                Logger.getLogger(SimplePlanificacionManager.class.getName()).log(Level.SEVERE, null, ex);
//            }
            f_result = false;
        } finally {
            if (pstm != null) {
                try {
                    pstm.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SimplePlanificacionManager.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SimplePlanificacionManager.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return f_result;
    }
    
    private int getCantSolicitudes() {
        ResultSet rst = null;
        String SQL = null;
        int max=0;
        try {

            SQL = "SELECT max(idSolicitud) from solicitud  ";
            rst =  new ConexionBD().ExecuteSelect(SQL, "SimplePlanificacionManager");
            if (rst.next()) {
                max = rst.getInt(1);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } 
        return max;
    }

    public int cantMinimaForRangos() {
        ResultSet rst = null;
        String SQL = null;
        int max=0;
        try {

            SQL = "SELECT descripcion FROM CatalogoDetalle WHERE abreviatura = 'CANTMINIMA'  ";
            rst =  new ConexionBD().ExecuteSelect(SQL, "SimplePlanificacionManager");
            if (rst.next()) {
                max = rst.getInt(1);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } 
        return max;
    }

    public String consultarFechasVistaAnual(String idUsuario,String idUsuarioAprobador, int anio) {
        StringBuilder  SQL = new StringBuilder();
        StringBuilder  resul = new StringBuilder();
        String cadFechas ="";
        int cont=0;
        try {
            SQL.append("SET DATEFORMAT ymd; SELECT [idSolicitud],[fechaInicio],[fechaFin],[estado],[idUsuarioSolicitante],[idUsuarioAprobador],[motivoSolicitud],[fechaCreacion],[tipoSolicitud]");
                SQL.append(" FROM Solicitud WHERE idUsuarioSolicitante='");
                SQL.append(idUsuario);      
                SQL.append("' AND idUsuarioAprobador ='");
                SQL.append(idUsuarioAprobador);
                SQL.append("' AND [fechaInicio] <='");
                SQL.append(anio);
                SQL.append("-12-31");
                SQL.append("' AND [fechaFin] >='");
                SQL.append(anio);
                SQL.append("-01-01");
                SQL.append("' AND tipoSolicitud ='");
                SQL.append(Constantes.SOLICITUD_PLANIFICADA);
                SQL.append("' ORDER BY [fechaInicio]");
                ResultSet rst = new ConexionBD().ExecuteSelect(SQL.toString(), "SimplePlanificacionManager");
                
                 while (rst.next()) {
                     if(cont>0)resul.append(",");
                     cadFechas = FechaUtil.listarFechasEntreRangosFechas(rst.getDate("fechaInicio"), rst.getDate("fechaFin"));
                     resul.append(cadFechas);
                     cont++;
                 }
            
        } catch (SQLException ex) {
            Logger.getLogger(SimplePlanificacionManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return resul.toString();
    }

    public int consultarSaldo(String idUsuario) {
        System.out.println("consultarSaldo");
        ConexionSAP conexionSAP = new ConexionSAP();
        double saldo=0;
        try {
            conexionSAP = ConexionSAP.getConexionSAP();
            conexionSAP.RegistrarRFC("ZHR_RFC_SALDO_VACACIONES");
            conexionSAP.IngresarDatosInput(idUsuario, "I_UNAME");
            conexionSAP.EjecutarRFC();
           
             saldo = conexionSAP.rFC.getExportParameterList().getDouble("O_SALDO_TOTAL");
            System.out.println("idUsuario:2 " + idUsuario + " saldo: " + saldo );
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            conexionSAP.DesconectarSAP();
        }
        return (int) Math.floor(saldo);
    }

    public String consultarEstado(String idUsuario, int anioActual, String idUsuarioAprobador) {
       String estado="";
       ResultSet rst = null;
        String SQL = null;
        try {

            SQL = "SELECT [estado] FROM "
            + "Estado "
            + "WHERE "
            + "[idUsuario]='"
            +  idUsuario
            //+  "' AND [idAnio]='"
            //+  anioActual   
            + "' AND [IdPuestoJefeInmediato]='"        
            +  idUsuarioAprobador
            + "'";
            
            rst =  new ConexionBD().ExecuteSelect(SQL, "SimplePlanificacionManager");
            if (rst.next()) {
                estado = rst.getString(1);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } 
       if(estado.equals("") || estado.equals(Constantes.ESTADO_JEFE_ENVIAR))estado=Constantes.ESTADO_INICIAL;
       return estado;
    }
    
    
public Usuario obtenerDataParaSolicitudVacaciones(Usuario usuario) {
        System.out.println("obtenerDataParaSolicitudVacaciones");
        ConexionSAP conexionSAP = new ConexionSAP();
        
        try {
            conexionSAP = ConexionSAP.getConexionSAP();
            conexionSAP.RegistrarRFC("ZHR_RFC_MOV_PERSONAL_SGV");
            System.out.println("USER: |" + usuario.getIdUsuario() + "|");
            conexionSAP.IngresarDatosInput(usuario.getIdUsuario(), "USER");
            conexionSAP.EjecutarRFC();

            usuario.setSociedadUsuario(conexionSAP.rFC.getExportParameterList().getField("SOCIEDAD").getString());
            usuario.setNombreUsuario(conexionSAP.rFC.getExportParameterList().getField("NAME").getString());
            usuario.setDivisionUsuario(conexionSAP.rFC.getExportParameterList().getField("DIVISION").getString());
            usuario.setAreaUsuario(conexionSAP.rFC.getExportParameterList().getField("SUBDIVISION").getString());
            usuario.setIdGrupoPersonal(conexionSAP.rFC.getExportParameterList().getField("TIPOEMPLEADO").getString());
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            conexionSAP.DesconectarSAP();
        }
        return usuario;
    }    
}
